//package leo.mystudy.executors;
//
//import java.util.concurrent.ThreadPoolExecutor;
//
///**
// * @author leo
// * @version 1.0.0
// * @description
// * @create 2022/2/28 17:01
// */
//public class R1 {
//    final void lock() {
//        acquire(1);
//    }
//
//    public final void acquire(int arg) {
//        // 同步队列中有线程 且 锁的所有者不是当前线程那么将线程加入到同步队列的尾部，
//        // 保证了公平性，也就是先来的线程先获得锁，后来的不能抢先获取。
//        if (!tryAcquire(arg) && acquireQueued(addWaiter(Node.EXCLUSIVE), arg)) selfInterrupt();
//    }
//
//    protected final boolean tryAcquire(int acquires) {
//        final Thread current = Thread.currentThread();
//        int c = getState();
//        //判断状态state是否等于0，等于0代表锁没有被占用，不等于0则代表锁被占用着。
//        if (c == 0) {
//            //调用hasQueuedPredecessors方法判断同步队列中是否有线程在等待，如果同步队列中没有
//            //线程在等待 则当前线程成为锁的所有者，如果同步队列中有线程在等待，则继续往下执行
//            //这个机制就是公平锁的机制，也就是先让先来的线程获取锁，后来的不能抢先获取。
//            if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) {
//                setExclusiveOwnerThread(current);
//                return true;
//            }
//        } else if (current == getExclusiveOwnerThread()) {
//            //判断当前线程是否为锁的所有者，如果是，那么直接更新状态state，然后返回true。
//            int nextc = c + acquires;
//            if (nextc < 0) throw new Error("Maximum lock count exceeded");
//            setState(nextc);
//            return true;
//        }
//        //如果同步队列中有线程存在 且 锁的所有者不是当前线程，则返回false。
//        return false;
//    }
//}
